﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using SIGCBI.Entities;
using SIGCBI.Repository;
using Microsoft.Practices.Unity;

namespace SIGCBI.BusinessLogic
{
    public interface ITrabajadorBL
    {
        List<TRABAJADOR> GetAllFromTrabajador();
        List<TRABAJADOR> GetAllFromTrabajadorByDescripcion(string descripcion);

        TRABAJADOR GetFromOnlyTrabajadorByDni(string dni);
        TRABAJADOR GetFromTrabajadorById(Int32 id);

        void AddTrabajador(TRABAJADOR Trabajador);
        void UpdateTrabajador(TRABAJADOR Trabajador);

        bool ExistDuplicidadTrabajador(string dni, string nombreCompleto, Int32 id);

    }

    public class TrabajadorBL : ITrabajadorBL
    {
        [Dependency]
        public ITrabajadorRepository trabajadorRepos { get; set; }

        public List<TRABAJADOR> GetAllFromTrabajador()
        {
            return trabajadorRepos.GetAllFromTrabajador();
        }

        public List<TRABAJADOR> GetAllFromTrabajadorByDescripcion(string descripcion)
        {
            return trabajadorRepos.GetAllFromTrabajadorByDescripcion(descripcion);
        }

        public TRABAJADOR GetFromOnlyTrabajadorByDni(string dni)
        {
            return trabajadorRepos.GetFromOnlyTrabajadorByDni(dni);
        }

        public TRABAJADOR GetFromTrabajadorById(int id)
        {
            return trabajadorRepos.GetFromTrabajadorById(id);
        }

        public void AddTrabajador(TRABAJADOR Trabajador)
        {
            var _NombreCompleto = Trabajador.ApePaterno + " " + Trabajador.ApeMaterno + ", " + Trabajador.Nombres;
            var duplicidad = trabajadorRepos.ExistDuplicidadTrabajador(Trabajador.Dni, _NombreCompleto, Trabajador.ID);

            if (!duplicidad)
            {
                var msg = "";
                var ok = Trabajador.Validate(out msg);
                if (ok)
                {
                    trabajadorRepos.AddTrabajador(Trabajador);
                }
                else
                {
                    throw new Exception(msg);
                }
            }
            else
            {
                var error = string.Format("Ya existe un Trabajador con la misma información\n" +
                    "Dni: " + Trabajador.Dni + "\nNombres: " + Trabajador.NombreCompleto);
                throw new Exception(error);
            }
        }

        public void UpdateTrabajador(TRABAJADOR Trabajador)
        {

            var duplicidad = trabajadorRepos.ExistDuplicidadTrabajador(Trabajador.Dni, Trabajador.NombreCompleto, Trabajador.ID);

            
                if (!duplicidad)
                {
                    var msg = "";
                    var ok = Trabajador.Validate(out msg);
                    if (ok)
                    {
                        trabajadorRepos.UpdateTrabajador(Trabajador);
                    }
                    else
                    {
                        throw new Exception(msg);
                    }
                }
                else
                {
                    var error = string.Format("Ya existe un Trabajador con la misma información\n" +
                        "Dni: " + Trabajador.Dni + "\nNombres: " + Trabajador.NombreCompleto);
                    throw new Exception(error);
                }
           
        }



        public bool ExistDuplicidadTrabajador(string dni, string nombreCompleto, int id)
        {
            return trabajadorRepos.ExistDuplicidadTrabajador(dni, nombreCompleto, id);
        }
    }
}
